package com.accp.taobao;

import com.accp.taobao.model.AirConditioner;
import com.accp.taobao.service.ReadFileThread;
import com.accp.taobao.util.ComparePrice;
import com.accp.taobao.util.CompareSalesNum;
import com.accp.taobao.service.ExtractDataThread;
import com.accp.taobao.util.ReadFileInfo;

import java.io.*;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
 *  1.使用多线程读入文本数据，最后连接到一起存储到一个StringBuffer中
 *  2.粗略对原文本数据进行筛选，去除大量无关文本，拿到包含目标数据的较小文本段
 *  3.使用多线程对文本进行进一步匹配，准确提取目标数据，并存入自定义的对象中
 *  4.主线程休眠，直到所有子线程结束任务
 *  5.进行排序输出
 *  Tips:适用于天猫TMALL
 */
public class App {

    public static void main( String[] args ) {
        //1.使用多线程将原文本分10段读入并存入数组dataGroup中
        String filePath="air-condition.txt";
        StringBuffer rowData=ReadFileInfo.getRowData(filePath);

        //2.粗略筛选原文本数据，获得包含目标数据的较大文本段
        //创建正则表达式,使用[\d\D]匹配包括换行符在内的所有字符
        Pattern pattern=Pattern.compile("<div class=\"product[^\\>]+?\\>[\\d\\D]*?</span>[\\d\\D]*?</p>[\\d\\D]*?</div>[\\d\\D]*?</div>");
        Matcher matcher=pattern.matcher(rowData);
        //获取若干包含目标数据的文本段，存入cleanedData表中
        ArrayList<String> cleanedData=new ArrayList<>();
        while(matcher.find()){
            cleanedData.add(matcher.group());
        }

        //3.使用多线程从包含目标数据的文本段中提取具体的数据
        //使用HashMap,方便使用多线程
        HashMap<Integer, AirConditioner> infoMap=new HashMap<>();
        for (int i = 0; i <cleanedData.size(); i++) {
            //laptop对象的由子线程给出，在此处先在图中新建节点，而不是在子线程中新建节点，以防止发生覆盖。
            infoMap.put(i,null);
            //提取当前文本段中的数据，并创建laptop对象，然后以i为键值存到map中
            Thread extractThread =new ExtractDataThread(i,cleanedData.get(i),infoMap);
            extractThread.start();
        }

        //4.主线程休眠，直到所有子线程结束任务
        try {
            while(Thread.activeCount()>2){
                Thread.sleep(0);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        //5.根据价格和销量分别输出排前三的laptop商品
        //转为数组，方便调用ArraySort方法排序
        AirConditioner [] airConditioners=new AirConditioner[infoMap.size()];
        infoMap.values().toArray(airConditioners);
        System.out.println("销量最高前三的是:");
        System.out.println("********************************************");
        //调用Array.sort方法进行排序，使用自定义的ComparatorSales比较器
        Arrays.sort(airConditioners,new CompareSalesNum());
        for (int i = 0; i < 3; i++) {
            System.out.println(airConditioners[i].toString());
        }

        System.out.println("价格最低前三的是:");
        System.out.println("********************************************");
        //调用Array.sort方法进行排序，使用自定义的ComparatorPrice比较器
        Arrays.sort(airConditioners,new ComparePrice());
        for (int i = 0; i < 3; i++) {
            System.out.println(airConditioners[i].toString());
        }
    }
}
